#ifndef __SM2_IMPL_H
#define __SM2_IMPL_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/* SM2Parameters定义（国密标准256位Elliptic Curve） */
#define SM2_IMPL_CURVE_SIZE    32  // 256位 = 32字节
#define SM2_IMPL_KEY_SIZE      32  // 私钥32字节
#define SM2_IMPL_PUBKEY_SIZE   64  // 公钥64字节(x,y)
#define SM2_IMPL_SIGNATURE_SIZE 64 // 签名64字节(r,s)

/* Elliptic Curve点结构 */
typedef struct {
    uint32_t x[8];  // X坐标（256位）
    uint32_t y[8];  // Y坐标（256位）
    uint8_t infinity;  // No穷远点标志
} SM2_Point;

/* SM2上下文 */
typedef struct {
    uint32_t private_key[8];  // 私钥（256位）
    SM2_Point public_key;     // 公钥点
    uint8_t key_loaded;       // KeyYesNo已Load
} SM2_Impl_Context;

/* Function声明 */

/**
 * @brief InitializeSM2上下文
 * @param ctx SM2上下文指针
 */
void SM2_Impl_Init(SM2_Impl_Context* ctx);

/**
 * @brief LoadSM2Key
 * @param ctx SM2上下文指针
 * @param private_key 私钥（32字节）
 */
void SM2_Impl_LoadKey(SM2_Impl_Context* ctx, const uint8_t* private_key);

/**
 * @brief Calculate公钥：Q = d*G
 * @param ctx SM2上下文指针
 */
void SM2_Impl_ComputePublicKey(SM2_Impl_Context* ctx);

/**
 * @brief SM2签名
 * @param ctx SM2上下文指针
 * @param hash 消息哈希（32字节）
 * @param signature Output签名（64字节：r||s）
 */
void SM2_Impl_Sign(const SM2_Impl_Context* ctx, const uint8_t* hash, uint8_t* signature);

/**
 * @brief SM2Verify
 * @param pubkey 公钥（64字节）
 * @param hash 消息哈希（32字节）
 * @param signature 签名（64字节）
 * @return 1=VerifySuccess, 0=Failed
 */
int SM2_Impl_Verify(const uint8_t* pubkey, const uint8_t* hash, const uint8_t* signature);

#ifdef __cplusplus
}
#endif

#endif /* __SM2_IMPL_H */
